Skip to content

NestJS 项目核心

项目目录结构

shell
src/
├── modules/
   ├── auth/          # 认证模块(JWT、登录)
   ├── user/          # 用户模块(用户-角色关联)
   ├── role/          # 角色模块(角色-权限关联)
   └── permission/    # 权限模块(权限定义)
├── common/
   ├── decorators/    # 自定义装饰器(@RequireRoles/@RequirePermissions)
   ├── guards/        # 权限守卫(RBACGuard)
   ├── pipes/         # 全局校验管道
   └── filters/       # 异常过滤器(处理校验错误)
├── config/            # 数据库/JWT 配置
└── app.module.ts

依赖

shell
# 核心依赖
npm i @nestjs/typeorm typeorm mysql2  # 数据库(也可替换为 pg/mongodb)
npm i class-validator class-transformer  # DTO 校验核心
npm i @nestjs/jwt bcryptjs  # JWT 认证 + 密码加密
npm i @nestjs/passport passport-jwt  # 可选:Passport 集成(简化 JWT 校验)
npm i reflect-metadata  # 元数据(装饰器必备)

TODO

  1. 目录规范
  2. JWT 校验需要重构,不使用官网提供的方式,不好理解
  3. 参数命名规范,使用 param body req 怎么选择 RESTful 规范建议: 资源的唯一标识(ID)优先放在 param 中(符合 REST 设计原则),而非 body。 仅传递「业务数据」时用 body,仅传递「资源定位信息」时用 param。

注意

  1. 后台系统的注册接口:正常的后台是没有注册功能的,而新用户是在用户管理模块需要通过创建用户接口来创建,如果非要做注册接口,可以在注册接口中注册后默认赋予普通用户的权限
  2. 修改使用 PUT 还是 PATCH
shell
维度      PUT 方法                         PATCH 方法
更新粒度 全量更新(替换整个资源)             部分更新(仅修改指定字段)
入参要求 必须传递资源的所有必填字段(即使未修改) 仅传递需要修改的字段
幂等性 幂等(多次调用结果一致)             幂等(RESTful 推荐,实现需保证)
语义     “替换” 资源(若不存在可创建)         “修改” 资源的部分属性
  1. 在 service 中定义逻辑,尽量不要引用其他方法的逻辑,否则有改动后其他逻辑也会携带变更
  2. 各个模块可以共享 Repository,Service ,推荐优先使用 Repository,尽量不要使用 service 否则改动后会相互影响

关于依赖注入的导出和导入

注意:如果导入的模块中还导入了其他模块,那么在本模块中也需要额外再导入其他关联模块

跨模块使用 Repository

把 userRepository 导入到 role.service.ts 中使用

shell
# 第一步:在 user.module.ts 中导出
exports: [TypeOrmModule.forFeature([User])],

# 第二步:在 role.module.ts 中导入
imports: [TypeOrmModule.forFeature([Role, User])], 

# 第三步:在 role.service.ts 中使用
@InjectRepository(User) private readonly userRepository: Repository<User>

跨模块使用 Service

一个道理,导入导出 service 即可

或者使用 import { Global } from '@nestjs/common'; 注册全局模块,就无需 export 和 import